package com.yubest;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

/**
 * 给定一组非负整数 nums，重新排列每个数的顺序（每个数不可拆分）使之组成一个最大的整数。
 *
 * 注意：输出结果可能非常大，所以你需要返回一个字符串而不是整数。
 *
 *
 *
 * 示例 1：
 *
 * 输入：nums = [10,2]
 * 输出："210"
 * 示例 2：
 *
 * 输入：nums = [3,30,34,5,9]
 * 输出："9534330"
 * 示例 3：
 *
 * 输入：nums = [1]
 * 输出："1"
 * 示例 4：
 *
 * 输入：nums = [10]
 * 输出："10"
 *
 *
 * 提示：
 *
 * 1 <= nums.length <= 100
 * 0 <= nums[i] <= 10^9
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/largest-number
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @Author hweiyu
 * @Description
 * @Date 2021/12/14 11:12
 */
public class P0179 {

    public static void main(String[] args) {
        System.out.println(new Solution179().largestNumber(new int[]{111311, 1113}));
    }
}

class Solution179 {

    /**
     * 思路：排序
     *
     * 对于 [4,42]，比较 442 > 424，需要把 44 放在前面；
     * 对于 [4,45]，比较 445 < 454，需要把 45 放在前面。
     *
     * @param nums
     * @return
     */
    public String largestNumber(int[] nums) {
        List<Integer> list = new ArrayList<>();
        for (int num : nums) {
            list.add(num);
        }
        /**
         * 对于 [4,42]，比较 442 > 424，需要把 44 放在前面；
         * 对于 [4,45]，比较 445 < 454，需要把 45 放在前面。
         */
        list.sort(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                long t1 = (long) Math.pow(10, String.valueOf(o1).length());
                long t2 = (long) Math.pow(10, String.valueOf(o2).length());

                long n1 = t2 * o1 + o2;
                long n2 = t1 * o2 + o1;

                return Long.compare(n2, n1);
            }
        });
        //处理0的情况
        if (list.get(0) == 0) {
            return "0";
        }
        StringBuilder buf = new StringBuilder();
        for (Integer num : list) {
            buf.append(num);
        }
        return buf.toString();
    }
}
